home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Free Software Collection 11
/
FM Towns Free Software Collection 11.iso
/
t_os
/
tool
/
genji
/
src
/
g_main.c
< prev
next >
Wrap
Text File
|
1995-08-13
|
11KB
|
528 lines
#include "genji.h"
#include "netdata.c"
#include "printcom.c"
char *errmes[8] = {
"\x0",
"\x0",
"プリンタ指定エラー1です",
"プリンタ指定エラー2です",
"用紙が切れています",
"プリンタがオフラインです",
"次のページの紙をセットしてください",
"プリンタが原因不明のエラーです" };
char pool[256];
void dataInit()
{
colrev_flg = OFF;
pitchmask = 2; /* truepitch = pitch * pitchmask / 2 */
/* tabsize = 4;*/
pitch = 54; /* 全角文字の文字ピッチ */
cr_p = 60; /* 改行幅 */
net_length = 0;
net_flg = OFF;
jisflg = OFF;
/* leftmargin = 0;*/
pageflg = OFF;
np = 1;
info[np][0] = 0;/*現在明朝体*/
info[np][1] = KS_XN_YN;/*現在文字サイズ標準*/
y_pos = 0;
endflg = OFF;
page = 1;
mode = 'A';
writepage = OFF;
lnum = 0;
control = OFF;
bufp = outbuf;
/* betaflg = OFF;*/
return;
}
void genji_mainPG( char *pdrname, char *defname, int betaflg )
{
FILE *fp;
union
{
unsigned short int sjis;
char c[2];
} moji;
struct ffblk fb;
unsigned int size;
int ch,e,i,j,comflg,sflg;
char combuf[16],usrbuf[256],gjbuf[288],gjbuf2[72];
char *p;
dataInit();
if( findfirst( pdrname, &fb, 0 ) )
{
VC_printf( "\"%s\"が見つかりません。\n", POINTER, pdrname );
return;
}
size = fb.ff_fsize.high<<16 | fb.ff_fsize.low;
if( ( file = (char *)malloc( size ) ) == NULL )
{
VC_printf( "メモリが足りません。\n" );
return;
}
if( ( fp = fopen( pdrname, "rb" ) ) == NULL )
{
VC_printf( "'%s'が読み込めません。\n", POINTER, pdrname );
return;
}
if( fread( file, 1, size, fp ) < size )
{
VC_printf( "データの読み込みに失敗しました。\n" );
fclose( fp );
return;
}
fclose( fp );
file_ = file;
bufp += addstrings( init, bufp ); /*解像度360dpi + 半角1byte指定*/
setLeftmargin( leftmargin );
VC_printf( "現在%dページ目を印刷中です。\n", UL_INT, page );
while( endflg == OFF )
{
lineInit();
sflg = ON;
while( lineflg == OFF )
{
comflg = OFF;
ch = (*file++) & 0xff;
if( file - file_ > size )
{
*bufp++ = 0x0a;
pageflg = ON;
endflg = ON;
break;
}
if( betaflg == ON )
goto LABEL01;
if( sflg == ON && ch == '#' )
{
control = ON;
continue;
}
sflg = OFF;
if( ch == '}' && np > 1 )
{
switch( nest[np--] )
{
case 10:/*文字サイズ*/
setKanjiSize( info[np][1] );
break;
case 19:/*フォント*/
setFontType( info[np][0] );
break;
case 21:/*漢字アンダーライン解除*/
setUnderline( OFF );
break;
case 32:/*欧文ピッチ解除*/
bufp += addstrings( prooff, bufp );
break;
case 40:/*網掛け解除*/
setNetEnd();
break;
case 47:/*白黒反転*/
setColorReverse();
break;
}
continue;
}
if( ch == '/' )
{
for( i=0; i<15; i++ )
combuf[i] = (*(file+i)) & 0xff;
combuf[16] = 0;
switch( getCommand2() )
{
case 1:/*半角1byte指定*/
bufp += addstrings( hss2, bufp );
comflg = ON;
break;
case 2:/*上付文字開始*/
if( pool[0] == 0 )
break;
incNest( 10 );
setBaseLine( BL_UPPER );
setKanjiSize( KS_XH_YH );
comflg = ON;
break;
case 4:/*下付文字開始*/
if( pool[0] == 0 )
break;
incNest( 10 );
setBaseLine( BL_BOTTOM );
setKanjiSize( KS_XH_YH );
comflg = ON;
break;
case 6:/*漢字文字ピッチ*/
if( pool[1] == 0 )
break;
i = DWORD( pool+2 );
if( i<48 || i>120 )
break;
pitch = i;
setKanjiPitch( pitch );
comflg = ON;
break;
case 8:/*改行ピッチ*/
if( pool[1] == 0 )
break;
i = DWORD( pool+2 );
if( i<1 || i>120 )
break;
cr_p = i;
setReturnPitch( cr_p );
comflg = ON;
break;
case 10:/*標準*/
if( pool[0] )
incNest( 10 );
pitchmask = 2;
setKanjiSize( KS_XN_YN );
comflg = ON;
break;
case 11:/*横倍*/
if( pool[0] )
incNest( 10 );
pitchmask = 4;
setKanjiSize( KS_XD_YN );
comflg = ON;
break;
case 12:/*縦倍*/
if( pool[0] )
incNest( 10 );
pitchmask = 2;
setKanjiSize( KS_XN_YD );
comflg = ON;
break;
case 13:/*縦横倍*/
if( pool[0] )
incNest( 10 );
pitchmask = 4;
setKanjiSize( KS_XD_YD );
comflg = ON;
break;
case 14:/*縦半分*/
if( pool[0] )
incNest( 10 );
pitchmask = 2;
setKanjiSize( KS_XN_YH );
comflg = ON;
break;
case 15:/*横半分*/
if( pool[0] )
incNest( 10 );
pitchmask = 1;
setKanjiSize( KS_XH_YN );
comflg = ON;
break;
case 16:/*縦半分横倍*/
if( pool[0] )
incNest( 10 );
pitchmask = 4;
setKanjiSize( KS_XD_YH );
comflg = ON;
break;
case 17:/*縦倍横半分*/
if( pool[0] )
incNest( 10 );
pitchmask = 1;
setKanjiSize( KS_XH_YD );
comflg = ON;
break;
case 18:/*縦横半分*/
if( pool[0] )
incNest( 10 );
pitchmask = 1;
setKanjiSize( KS_XH_YH );
comflg = ON;
break;
case 19:/*ゴシック*/
if( pool[0] )
incNest( 19 );
setFontType( 1 );
comflg = ON;
break;
case 20:/*明朝体*/
if( pool[0] )
incNest( 19 );
setFontType( 0 );
comflg = ON;
break;
case 21:/*漢字アンダーライン指定*/
if( ! pool[0] )
break;
incNest( 21 );
setUnderline( ON );
comflg = ON;
break;
case 27:/*罫線接続指定*/
setLineConnect( ON );
comflg = ON;
break;
case 28:/*罫線接続解除*/
setLineConnect( OFF );
comflg = ON;
break;
case 29:/*漢字縦倍上端合わせ*/
setBaseLine( 0 );
comflg = ON;
break;
case 30:/*漢字縦倍下端合わせ*/
setBaseLine( 1 );
comflg = ON;
break;
case 31:/*漢字縦倍中心合わせ*/
setBaseLine( 2 );
comflg = ON;
break;
case 32:/*欧文ピッチ指定*/
if( pool[0] == 0 )
break;
bufp += addstrings( proon, bufp );
incNest( 32 );
comflg = ON;
break;
case 38:/*ページ変更*/
pageflg = ON;
comflg = ON;
break;
case 39:/*レフトマージン指定*/
if( pool[1] == 0 )
break;
i = DWORD( pool+2 );
if( i<0 || i>80 )
break;
setLeftmargin( i );
leftmargin = i;
comflg = ON;
break;
case 40:/*網掛け*/
if( pool[1] == 0 || pool[0] == 0 )
break;
net_sort = DWORD( pool+2 );
if( net_sort<0 || net_sort>4 )
break;
setNetStart();
incNest( 40 );
comflg = ON;
break;
case 41:/*漢字縦書き指定*/
setPrintDirection( 1 );
comflg = ON;
break;
case 42:/*漢字横書き指定*/
setPrintDirection( 0 );
comflg = ON;
break;
case 43:/*毛筆体*/
if( pool[0] )
incNest( 19 );
setFontType( 2 );
comflg = ON;
break;
case 44:/*丸文字*/
if( pool[0] )
incNest( 19 );
setFontType( 3 );
comflg = ON;
break;
case 45:/*教科書体*/
if( pool[0] )
incNest( 19 );
setFontType( 4 );
comflg = ON;
break;
case 46:/*JIS指定*/
if( pool[1] == 0 )
break;
jiscode = DWORD( pool+2 );
goto D_JIS_IN;
break;
case 47:/*白黒反転*/
if( pool[0] )
incNest( 47 );
setColorReverse();
comflg = ON;
break;
case 48:/*タブサイズ指定*/
if( pool[1] == 0 )
break;
i = DWORD( pool+2 );
if( i<0 || i>8 )
break;
tabsize = i;
comflg = ON;
break;
}
if( comflg == ON )
continue;
ch = (*file++) & 0xff;
}
LABEL01:
if( ch == 0x0a )
{
if( control == OFF )
{
if( net_flg == ON )
net_length = x_pos - net_sp;
if( net_length > 0 )
printNet();
*bufp++ = 0x0a;
}
lineflg = ON;
break;
}
if( control )
continue;
if( ch == 0x09 )
{
setAsciiMode();
do
{
addstrings( "\x20", bufp );
bufp ++;
x_pos += pitch*pitchmask/4;
}
while( ( ( x_pos - leftmargin*27 )/ (pitch/2) ) % tabsize );
continue;
}
if( ch>0xe0 || (ch>0x80 && ch<0xa0) )
{
moji.c[1] = (unsigned char)ch;
moji.c[0] = (unsigned char)(*file) & 0xff;
file++;
jiscode = FNT_sjisToJis( (int)moji.sjis );
D_JIS_IN:
setKanjiMode();
moji.sjis = (unsigned short int)jiscode;
i = ( moji.c[1] == 0x28 )? 0: info[np][0];
switch( i )
{
case 0:/*明朝体*/
if( colrev_flg == OFF )
break;
if( mint_flg == OFF )
break;
fseek( mint_fp, ((moji.c[1]-0x21)*94+(moji.c[0]-0x21)+128)*288+16, SEEK_SET );
fread( gjbuf, 1, 288, mint_fp );
break;
case 1:/*ゴシック体*/
if( colrev_flg == OFF )
break;
if( goth_flg == OFF )
break;
fseek( goth_fp, ((moji.c[1]-0x21)*94+(moji.c[0]-0x21)+128)*288+16, SEEK_SET );
fread( gjbuf, 1, 288, goth_fp );
break;
case 2:/*毛筆体*/
if( mouh_flg == OFF )
break;
fseek( mouh_fp, ((moji.c[1]-0x21)*94+(moji.c[0]-0x21)+128)*288+16, SEEK_SET );
fread( gjbuf, 1, 288, mouh_fp );
break;
case 3:/*丸文字*/
if( maru_flg == OFF )
break;
fseek( maru_fp, ((moji.c[1]-0x21)*94+(moji.c[0]-0x21))*74+18, SEEK_SET );
fread( gjbuf2, 1, 72, maru_fp );
convert24to48( gjbuf2, gjbuf );
break;
case 4:/*教科書体*/
if( kyou_flg == OFF )
break;
fseek( kyou_fp, ((moji.c[1]-0x21)*94+(moji.c[0]-0x21))*74+18, SEEK_SET );
fread( gjbuf2, 1, 72, kyou_fp );
convert24to48( gjbuf2, gjbuf );
break;
}
if( ( i != 0 && i != 1 ) || ( colrev_flg == ON ) )
{
*(defgj+5) = (usrjis>>8)&0xff;
*(defgj+6) = (usrjis)&0xff;
bufp += addstrings( defgj, bufp );
/* if( colrev_flg == ON )
{
for( i=0; i<72; i++ )
DWORD( gjbuf+i*4 ) ^= 0xffffffff;
}????「ここでハングアップ」????*/
memcpy( bufp, gjbuf, 288 );
bufp += 288;
moji.sjis = (unsigned short int)usrjis;
++ usrjis;
}
*bufp++ = moji.c[1];
*bufp++ = moji.c[0];
x_pos += pitch*pitchmask/2;
}
else
{
setAsciiMode();
*bufp++ = (char)ch;
x_pos += pitch*pitchmask/4;
}
}
if( flushBuffer() )
break;
lineTerm();
if( ! control )
++ lnum;
if( lnum == lpp )
pageflg = ON;
if( pageflg == ON )
{
lnum = 0;
if( writepage == ON )
{
printPage( page );
if( flushBuffer() )
break;
}
if( endflg == OFF )
{
page++;
y_pos = 0;
pageflg = OFF;
printReady( 6 );
VC_printf( "現在%dページ目を印刷中です。\n", UL_INT, page );
}
}
}
VC_printf( "印刷を終了します。\n" );
return;
}